package cn.yu_lu.utils;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.UUID;

/**
 * 数据生成工具类
 * @author zhang
 *
 */
public class DataUtil {

	/**
	 * 获取一个UUID字符串
	 * @return uuid字符串
	 */
	public static String uuid(){
		return UUID.randomUUID().toString().replaceAll("-","");
	}
	
	/**
	 * 获取一个随机整数
	 * @return 随机整数
	 */
	public static int randomInt(){
		return (new Random()).nextInt();
	}
	
	/**
	 * 获取一个介于指定最小值(包含)，最大值(不包含)之间的整数
	 * @param min	最小值
	 * @param max	最大值
	 * @return 随机整数
	 * @throws IllegalArgumentException 当最大值小于等于最小值时抛出
	 */
	public static int randomInt(int min,int max){
		if(max<=min) throw new IllegalArgumentException();
		return (new Random()).nextInt(max-min)+min;
	}
	
	//随机字符使用的字符数组
	private static final char[] RANDOM_CHAR_BASE={
			'1','2','3','4','5','6','7','8','9','0',
			'a','b','c','d','e','f','g','h','i','j','k','l','m',
			'n','o','p','q','r','s','t','u','v','w','x','y','z',
			'A','B','C','D','E','F','G','H','I','J','K','L','M',
			'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
	};
	
	/**
	 * 获取一个随机字符
	 * @return 随机字符
	 */
	public static char randomChar(){
		return RANDOM_CHAR_BASE[randomInt(0,RANDOM_CHAR_BASE.length)];
	}
	
	/**
	 * 获取一个指定长度的随机字符串
	 * @param length 随机字符串的长度
	 * @return 随机字符串,当length<0时返回null,当length==0时返回""
	 */
	public static String randomStr(int length){
		if(length<0) return null;
		if(length==0) return "";
		StringBuilder strBuilder=new StringBuilder();
		for(int i=0;i<length;i++){
			strBuilder.append(randomChar());
		}
		return strBuilder.toString();
	}
	
	/**
	 * 从指定的数组中随机选取一个元素
	 * @param data 数据数组
	 * @return 随机元素,传入空数组时返回null
	 */
	public static <T> T random(T[] data){
		if(JudgeUtil.isBlank(data)) return null;
		return data[randomInt(0,data.length)];
	}
	
	/**
	 * 从指定的集合（包含元素与其出现概率的映射）随机选取一个元素
	 * 使用事例：
	 * Map<Item,Double> data=new HashMap<Item,Double>();
	 * data.put(item1,0.2);
	 * data.put(item2,0.8);
	 * Item item=DataUtil.random(data);
	 * @param data 数据集合
	 * @return 随机元素,传入空集合时返回null
	 * @throws 当元素出现概率为非法值（概率值<0或概率值>1）时排除
	 */
	public static <E> E random(Map<E,Double> data){
		if(JudgeUtil.isBlank(data)) return null;
		double useChance=0;
		double randomData=Math.random();
		Set<Entry<E, Double>> entrySet = data.entrySet();
		Iterator<Entry<E, Double>> iterator = entrySet.iterator();
		while(iterator.hasNext()){
			Entry<E, Double> e = iterator.next();
			double chance=e.getValue();
			if(chance<0||chance>1) throw new IllegalArgumentException();
			if(chance==0) continue;
			if(chance==1) return e.getKey();
			if(randomData>=useChance&&randomData<(useChance+chance)) return e.getKey();
			useChance+=chance;
		}
		return null;
	}
}
